package com.ji.TestRedis;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

@SuppressWarnings("unchecked")
public class RedisObj implements RedisOpt{
	private ObjectRedisTemplate<Object> objRedisTemplate;

	public ObjectRedisTemplate<Object> getObjRedisTemplate() {
		return objRedisTemplate;
	}

	public void setObjRedisTemplate(ObjectRedisTemplate<Object> objRedisTemplate) {
		this.objRedisTemplate = objRedisTemplate;
	}

	/**
	 * 删除某个键
	 * 
	 * @param redisKey
	 *
	 */
	public void delKey(String redisKey) {
		objRedisTemplate.delete(redisKey);
	}

	/**
	 * 是否存在对应的key
	 * 
	 * @param redisKey
	 * @return
	 *
	 */
	public boolean hasKey(String redisKey) {
		return objRedisTemplate.hasKey(redisKey);
	}

	//////////////////////////////////////////// Obj///////////////////////////////////////////////
	/**
	 * 添加obj类型数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @param values
	 *
	 */
	public <T> void put(String redisKey, T values) {
		objRedisTemplate.opsForValue().set(redisKey, values);
	}

	/**
	 * 获得obj类型
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @return
	 *
	 */
	public <T> T get(String redisKey) {
		return (T) objRedisTemplate.opsForValue().get(redisKey);
	}
	//////////////////////////////////////////// hash///////////////////////////////////////////////

	/**
	 * 插入list数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @param values
	 *
	 */
	public <T> void pusList(String redisKey, T... values) {
		if (values == null || values.length == 0) {
			return;
		}
		for (T val : values) {
			objRedisTemplate.opsForList().rightPush(redisKey, val);
		}
	}

	/**
	 * 获得list数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @param start
	 * @param end
	 * @return
	 *
	 */
	public <T> List<T> getList(String redisKey, int start, int end) {
		return (List<T>) objRedisTemplate.opsForList().range(redisKey, start, end);
	}

	/**
	 * 获得list里所有数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @return
	 *
	 */
	public <T> List<T> getListAll(String redisKey) {
		return getList(redisKey, 0, -1);
	}

	//////////////////////////////////////////// set///////////////////////////////////////////////
	/**
	 * 插入set数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @param values
	 *
	 */
	public <T> void putSet(String redisKey, T... values) {
		if (values == null || values.length == 0) {
			return;
		}
		for (T val : values) {
			objRedisTemplate.opsForSet().add(redisKey, val);
		}
	}

	/**
	 * 获得集合数据
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @return
	 *
	 */
	public <T> Set<T> getSet(String redisKey) {
		return (Set<T>) objRedisTemplate.opsForSet().members(redisKey);
	}

	//////////////////////////////////////////// map///////////////////////////////////////////////
	/**
	 * 插入map类型数据(value为对象，此方法会自动将对象转化成json)
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @param map
	 *
	 */
	public <T> void putMap(String redisKey, Map<String, T> map) {
		if (map == null || map.size() == 0) {
			return;
		}
		Iterator<String> it = map.keySet().iterator();
		while (it.hasNext()) {
			String k = it.next();
			T v = map.get(k);
			objRedisTemplate.opsForHash().put(redisKey, k, v);
		}
	}

	/**
	 * 获得map体
	 * 
	 * @param redisKey
	 * @param map
	 * @return
	 *
	 */
	public Map<Object, Object> getMapAll(String redisKey) {
		return objRedisTemplate.opsForHash().entries(redisKey);
	}

	/**
	 * 从map中获得对应对象
	 * 
	 * @param <T>
	 * 
	 * @param redisKey
	 * @return
	 *
	 */
	public <T> T getByMapKey(String redisKey, String mapKey) {
		return (T) objRedisTemplate.opsForHash().get(redisKey, mapKey);
	}

}
